package cn.gov.cus.rmftquartz.common.utils;

import java.util.ArrayList;
import java.util.List;

/**
 * @author wxming.
 * @date 2018/3/21.
 */
public class MyGuoHe {

    private static String lastWangYouZuHe="";
    private static String lastWangZuoZuHe="";
    private static List<String> listZuHeWangYou = new ArrayList<String>();
    private static List<String> listZuHeWangZuo = new ArrayList<String>();
    private static List listZuo = new ArrayList<>();
    private static List listYou = new ArrayList<>();
    private static List luXianOkList = new ArrayList<>();
    private static List luXianList = new ArrayList<>();
    private static String nowConnotWangYouZuHe="";
    private static String nowConnotWangZuoZuHe="";

    //要把所有情况都出来，把listZuHeWangYou和listZuHeWangZuo不同顺序的组合都走一遍就行。最外层两个循环即能实现，注意全局变量的初始化。但会有重复情况发生，最后还需去一下重。

    public static void main(String[] args){
        String s1="警察";
        String s2="父亲";
        String s3="母亲";
        String s4="犯人";
        String s5="儿一";
        String s6="儿二";
        String s7="女一";
        String s8="女二";
        String[] hua={s1,s2,s3};
        String[] huaNo={s4,s5,s6,s7,s8};
        //得出乘船组合。可以直接得出：从左往右只有一个人没有意义，因为要往右运人，无论这个人过去换回另一个或另两个，都证明来回双方可以独立在任何一岸，换一下没有意义。
        //从右往左时带着儿子或者女儿也没有意义，因为要往右运，且儿子和女儿不会伤害别人，也不会自己划船，运过去再运回来的方式浪费效率。

        //List<String> listZuHe = new ArrayList<String>();

        for(String sh:hua){
            listZuHeWangZuo.add(sh+",空");
        }
        for(int i=0;i<hua.length-1;i++){
            for(int l=i+1;l<hua.length;l++){
                listZuHeWangZuo.add(hua[i]+","+hua[l]);
                listZuHeWangYou.add(hua[i]+","+hua[l]);
            }
        }
        for(String sh:hua){
            for(String shN:huaNo){
                String zuZi=sh+","+shN;
                if(!((zuZi.contains("犯人") && !zuZi.contains("警察")) || (zuZi.contains("父亲") && zuZi.contains("女"))
                        || (zuZi.contains("母亲") && zuZi.contains("儿")))){
                    listZuHeWangYou.add(zuZi);
                    if(!zuZi.contains("女") && !zuZi.contains("儿")){
                        listZuHeWangZuo.add(zuZi);
                    }
                }
            }
        }
        //设置左右岸即时初始情况。
        listZuo.add(s1);
        listZuo.add(s2);
        listZuo.add(s3);
        listZuo.add(s4);
        listZuo.add(s5);
        listZuo.add(s6);
        listZuo.add(s7);
        listZuo.add(s8);

        //开始走。乘船组合：listZuHeWangZuo,listZuHeWangYou;左岸：listZuo;右岸：listYou。
        //lastWangYouZuHe,lastWangZuoZuHe
        System.out.println(listZuHeWangYou.toString());
        System.out.println(listZuHeWangZuo.toString());

        List listZuoBaoCun=new ArrayList();
        listZuoBaoCun.addAll(listZuo);
        List listYouBaoCun=new ArrayList();
        listYouBaoCun.addAll(listYou);

        while(true){
            if(stepWangYou()){
                if(ifFinalOk()){
                    break;
                }else if(stepWangZuo()){

                }else{
                    System.out.println(luXianList.toString());
                    System.out.println("===============================");
                    listZuo.clear();
                    listZuo.addAll(listZuoBaoCun);
                    listYou.clear();
                    listYou.addAll(listYouBaoCun);
                    luXianList.clear();
                }
            }else{
                System.out.println(luXianList.toString());
                System.out.println("++++++++++++++++++");
                listZuo.clear();
                listZuo.addAll(listZuoBaoCun);
                listYou.clear();
                listYou.addAll(listYouBaoCun);
                luXianList.clear();
            }
        }



        System.out.println("循环打印出路线");
    }

    private static boolean stepWangYou(){
        List listZuoBaoCun=new ArrayList();
        listZuoBaoCun.addAll(listZuo);
        List listYouBaoCun=new ArrayList();
        listYouBaoCun.addAll(listYou);

        for(String zh:listZuHeWangYou){
            if(zh.equals(lastWangZuoZuHe) || zh.equals(lastWangYouZuHe)){
                nowConnotWangYouZuHe+=zh;
                continue;
            }
            String[] zhArr = zh.split(",");
            List jiaoHuan = new ArrayList();
            boolean flag=true;
            for(String zhArrStr:zhArr){
                if(listZuo.remove(zhArrStr)){
                    jiaoHuan.add(zhArrStr);
                }else{
                    nowConnotWangYouZuHe+=zh;
                    flag=false;
                    break;
                }
            }
            if(flag){
                listYou.addAll(jiaoHuan);
            }else{
                listZuo.clear();
                listZuo.addAll(listZuoBaoCun);
                continue;
            }
            if(ifStepOk()){
                lastWangYouZuHe=zh;
                luXianList.add(zh);
                return true;
            }else{
                nowConnotWangYouZuHe+=zh;
                listZuo.clear();
                listZuo.addAll(listZuoBaoCun);
                listYou.clear();
                listYou.addAll(listYouBaoCun);
            }
        }
        return false;
    }

    private static boolean stepWangZuo(){
        List listZuoBaoCun=new ArrayList();
        listZuoBaoCun.addAll(listZuo);
        List listYouBaoCun=new ArrayList();
        listYouBaoCun.addAll(listYou);

        for(String zh:listZuHeWangZuo){
            if(zh.equals(lastWangYouZuHe) || zh.equals(lastWangZuoZuHe)){
                continue;
            }
            String[] zhArr = zh.split(",");
            List jiaoHuan = new ArrayList();
            boolean flag=true;
            for(String zhArrStr:zhArr){
                if(!"空".equals(zhArrStr)){
                    if(listYou.remove(zhArrStr)){
                        jiaoHuan.add(zhArrStr);
                    }else{
                        flag=false;
                        break;
                    }
                }
            }
            if(flag){
                listZuo.addAll(jiaoHuan);
            }else{
                listYou.clear();
                listYou.addAll(listYouBaoCun);
                continue;
            }
            if(ifStepOk()){
                lastWangZuoZuHe=zh;
                luXianList.add(zh);
                return true;
            }else{
                listZuo.clear();
                listZuo.addAll(listZuoBaoCun);
                listYou.clear();
                listYou.addAll(listYouBaoCun);
            }
        }
        return false;
    }

    private static boolean ifFinalOk(){
        if(listZuo.size()==0 && listYou.size()==8){
            System.out.println(luXianList.toString());
            luXianOkList.add(luXianList);
            return true;
        }
        return false;
    }

    private static boolean ifStepOk(){
        String SZuo = listZuo.toString();
        String SYou = listYou.toString();
        if(listZuo.size()>1 && ((SZuo.contains("犯人") && !SZuo.contains("警察")) || (SZuo.contains("女") && SZuo.contains("父亲") && !SZuo.contains("母亲"))
                || (SZuo.contains("儿") && SZuo.contains("母亲") && !SZuo.contains("父亲")))){
            return false;
        }
        if(listYou.size()>1 && ((SYou.contains("犯人") && !SYou.contains("警察")) || (SYou.contains("女") && SYou.contains("父亲") && !SYou.contains("母亲"))
                || (SYou.contains("儿") && SYou.contains("母亲") && !SYou.contains("父亲")))){
            return false;
        }
        return true;
    }
}
